//
//  CZUserAccount.swift
//  1215微博终极项目
//
//  Created by chok崋 on 15/12/19.
//  Copyright © 2015年 周卓华. All rights reserved.
//

import UIKit

class CZUserAccount: NSObject ,NSCoding{
    
    //提供一个类属性,判断用户是否登录,仅使用get方法,直接返回
    class var userLogin:Bool
    {
        //有账号返回TRUE，没有账号返回false
          return CZUserAccount.loadUserAccount() != nil
    }

    //定义post请求返回的accesonToken值的模型属性
    var access_token:String?
    //当前授权的用户UID
    var uid:String?
    
    //accessToken的生命周期是秒数
    var expires_in:NSTimeInterval = 0 {
        //已经设置过属性的值的时候自动转换成NSData类型
        didSet
        {
           expires_Date = NSDate(timeIntervalSinceNow: expires_in)
        }
    }
    
    //过期的时间
    var expires_Date :NSDate?
    
    //字典转模型
    init(dict:[String:AnyObject])
    {
        super.init()
        
        setValuesForKeysWithDictionary(dict)
    }
    
    //当字典里面找不到属性的时候调用
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
   override var description:String
    {
       get
       {
          return "access_token: \(access_token), uid: \(uid), expires_in: \(expires_in), expires_Date: \(expires_Date)"
       }
    }
    
    //mark:归档和解档
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(access_token, forKey: "access_token")
        aCoder.encodeObject(uid, forKey: "uid")
        aCoder.encodeDouble(expires_in, forKey: "expires_in")
        aCoder.encodeObject(expires_Date, forKey: "expires_Date")
    }
    
    //解档
    required init?(coder aDecoder: NSCoder) {
        //将anyObject强制转成string
        access_token = aDecoder.decodeObjectForKey("access_token") as? String
        uid = aDecoder.decodeObjectForKey("uid") as? String
        expires_in = aDecoder.decodeDoubleForKey("expires_in")
        expires_Date = aDecoder.decodeObjectForKey("expires_Date") as? NSDate
    }
    
    //获取沙盒路径
    static let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString ).stringByAppendingPathComponent("userAcount.plist")
    
    //保存账户信息
    func saveUserAccount()
    {
        //对象方法里需要访问静态属性，需要加对象名
        NSKeyedArchiver.archiveRootObject(self, toFile: CZUserAccount.path)
    }
    
    //定义一个属性，存储用户的账户信息,这样每次调用都会从内存中加载，不必每次都解档一次，消耗性能
    static var userAccount : CZUserAccount?
    
    class func loadUserAccount() -> CZUserAccount?
    {
        //内存中没有账户信息，就解档获得信息
        if userAccount == nil
        {
             userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? CZUserAccount
        }
        
        //内存中不是为空，而且没有过期
        if  userAccount != nil && userAccount?.expires_Date?.compare(NSDate()) == NSComparisonResult.OrderedDescending
        {
            print("加载到可用的账户")
            return userAccount
        }
        
        return nil
    }
    
    //程序一开始就需要解档，所以要写成类方法
    //账号不一定存在，没有登录，或者accessToken过期
//    class func loadUserAccount() -> CZUserAccount?
//    {
//        if let userAcount = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? CZUserAccount
//        {
//            //判断是否过期了
//            //NSDate为当前的时间
//            //降序---OrderedDescending
//            if userAcount.expires_Date?.compare(NSDate()) == NSComparisonResult.OrderedDescending
//            {
//                print("加载到可用的账号")
//                return userAcount
//            }else
//            {
//                print("账号过期")
//                return nil
//            }
//        }else
//        {
//           print("没有加载到账号")
//        }
//        return nil
//    }

}










